home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_200
/
235_01
/
fileio.asm
< prev
next >
Wrap
Assembly Source File
|
1987-06-16
|
7KB
|
260 lines
PAGE 60,132
TITLE Routines to do low level file i/o
; 005 14-Jan-87 fileio.asm
; Copyright (c) 1987 by Blue Sky Software. All rights reserved.
_TEXT SEGMENT BYTE PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT WORD PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
DGROUP GROUP CONST, _BSS, _DATA
ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
_DATA SEGMENT
EXTRN _errno:WORD
EXTRN __doserrno:WORD
_DATA ENDS
_TEXT SEGMENT
;*****************************************************************************
;
; l_seek(fh,offset)
; int fh; file handle
; long offset; offset in file to seek to (from start of file)
;
; Seek to a specific position in file.
;
;*****************************************************************************
PUBLIC _l_seek
_l_seek PROC NEAR
push bp
mov bp,sp
; Basically lseek(fh,offset,SEEK_SET)
mov ax,4200h ;seek from start of file
mov bx,[bp+4] ;file handle
mov cx,[bp+8] ;offset (most significant)
mov dx,[bp+6] ; (least significant)
int 21h
jnc seekex ;jmp if no error
call fakerror ;fake errno/_doserrno values
mov ax,-1 ;error, tell couldnt seek by
mov dx,ax ; returning -1L
seekex: mov sp,bp
pop bp
ret
_l_seek ENDP
;*****************************************************************************
;
; readbuf(fh,bp,bl)
; int fh; /* file handle */
; char far *bp; /* memory loc to read to */
; unsigned int bl; /* amount to read */
;
; Read a buffer from the current location in file.
;
;*****************************************************************************
PUBLIC _readbuf
_readbuf PROC NEAR
push bp
mov bp,sp
push ds ;save current data seg
mov ah,3fh ;read file
mov bx,[bp+4] ;file handle
mov cx,[bp+10] ;bl (buffer length)
lds dx,DWORD PTR [bp+6] ;bp (buffer pointer)
int 21h
pop ds ;restore ds
jnc readex ;jmp if no error
call fakerror ;fake errno/_doserrno values
xor ax,ax ;error, tell caller 0 bytes read
readex: mov sp,bp
pop bp
ret
_readbuf ENDP
;*****************************************************************************
;
; writebuf(fh,bp,bl)
; int fh; /* file handle */
; char far *bp; /* memory loc to read to */
; unsigned int bl; /* amount to read */
;
; Write a buffer to the current location in file.
;
;*****************************************************************************
PUBLIC _writebuf
_writebuf PROC NEAR
push bp
mov bp,sp
push ds ;save current data seg
mov ah,40h ;write file
mov bx,[bp+4] ;file handle
mov cx,[bp+10] ;bl (buffer length)
lds dx,DWORD PTR [bp+6] ;bp (buffer pointer)
int 21h
pop ds ;restore ds
jnc writex ;jmp if no error
call fakerror ;fake errno/_doserrno values
mov ax,-1 ;tell caller error happened
writex: mov sp,bp
pop bp
ret
_writebuf ENDP
;*****************************************************************************
;
; setftime(fh,date,time)
; int fh; /* file handle */
; unsigned int date; /* date to set on file */
; unsigned int time; /* time to set on file */
;
; Set the creation/revision date/time on a file.
;
;*****************************************************************************
PUBLIC _setftime
_setftime PROC NEAR
push bp
mov bp,sp
mov ax,5701h ;set file date/time function
mov bx,[bp+4] ;file handle
mov cx,[bp+8] ;file time
mov dx,[bp+6] ;file date
int 21h
mov sp,bp ;no error checking done
pop bp
ret
_setftime ENDP
;*****************************************************************************
;
; getcdir(drive,buffer)
; int drive;
; char *buffer;
;
; Get the current dir for given drive.
;
;*****************************************************************************
PUBLIC _getcdir
_getcdir PROC NEAR
push bp
mov bp,sp
push si
mov ah,47h ;get current dir
mov dl,BYTE PTR [bp+4] ;drive code to DL
mov si,[bp+6] ;buffer ptr to DS:SI
mov BYTE PTR [si],0 ;make sure its terminated if error
int 21h
pop si
mov sp,bp ;no error checking done
pop bp
ret
_getcdir ENDP
;*****************************************************************************
;
; setattrib(fn,attrs)
; char *fn; /* file name */
; unsigned int attrs; /* attributes to set */
;
; Set the file attributes
;
;*****************************************************************************
PUBLIC _setattrib
_setattrib PROC NEAR
push bp
mov bp,sp
mov ax,4301h ;CHMOD dos function
mov cx,[bp+6] ;file attributes
mov dx,[bp+4] ;file name
int 21h
mov sp,bp ;no error checking done
pop bp
ret
_setattrib ENDP
;*****************************************************************************
;
; fakerror - fake errno and _doserrno values based on error code in ax
;
; This is very very MSDOS/MSC dependent!
;
;*****************************************************************************
EACCES = 13 ; errno value for access error *** these values correspond **
EBADF = 9 ; errno value for bad file handle *** to values in errno.h **
fakerror PROC NEAR
mov __doserrno,ax ;save raw error code in _doserrno
cmp ax,6 ;did dos say bad file handle?
jne access
mov _errno,EBADF ;bad file handle
ret
access: mov _errno,EACCES ;return any other as access error
ret
fakerror ENDP
_TEXT ENDS
END